<?php

namespace App\Utils;

/**
 * PHP原生Session操作工具类
 */
class INIUtil
{
    const INI_PATH = __DIR__ . "/../../env.ini";

    private static $instance = null;

    /**
     * 所有的配置参数数组
     */
    private $attributes = [];

    /**
     * 获取到当前配置文件读写的实例
     */
    public static function getInstance()
    {
        if (empty(self::$instance)) {
            self::$instance = new INIUtil();
            if (empty(self::$instance->attributes)) {
                self::$instance->attributes = parse_ini_file(self::INI_PATH);
            }
        }
        return self::$instance;
    }


    /**
     * 读 / 写 INI 配置项（目前只实现读取功能）
     * @param $key
     * @param $default
     * @return mixed
     */
    public static function ini($key, $default = "")
    {
        if (empty($key)) {
            return $default;
        }

        $ins = self::getInstance();
        if (empty($ins->attributes)) {
            $ins->attributes = parse_ini_file(self::INI_PATH);
        }

        if (isset($ins->attributes[$key])) {
            return $ins->attributes[$key];
        }
        return $default;
    }

    /**
     * 判断INI当中是否包含某个/组键
     * @param string|array $key 一个键或者一个键数组
     * @param bool $all 表示是否包判定含所有键
     * @return bool
     */
    public static function has($key, $all = true)
    {
        $ins = self::getInstance();
        $result = true;

        if (!is_array($key)) {
            $result = array_has($ins->attributes, $key);
            return $result;
        }

        foreach ($key as $item) {
            if (!$all) {
                $result = array_has($ins->attributes, $item);
                if ($result) {
                    break;  //监测有一个键名存在就行了
                }
            } else {
                $result = $result && array_has($ins->attributes, $item);
                if (!$result) {
                    break;  //监测到有一个键不存在，直接判定结果
                }
            }
        }
        return $result;
    }
}